package kr.or.common.util;

public class PagingHelper {
	
	private long plTotalCnt;	// 전체 레코드 수
	private long plRowRange;	// 결과목록에 보여지는 레코드 수
	private long plPageRange;	// 페이지 출력 범위
	private long plCurrPage;	// 현재 페이지
	
	
	public static PagingHelper instance = new PagingHelper();
	
	private PagingHelper() {}
	
	
	
	
	/**
	 * 페이징 모듈 초기화 <br>
	 * 
	 * @param plTotalCnt 전체 레코드 수
	 * @param plRowRange 결과목록에 보여지는 레코드 수
	 * @param plPageRange 페이지 출력 범위
	 * @param plCurrPage 현재 페이지
	 * @return
	 */
	public void init(long plTotalCnt, long plRowRange, long plPageRange, long plCurrPage)
	{
		this.plTotalCnt = plTotalCnt;
		this.plRowRange = plRowRange;
		this.plPageRange = plPageRange;
		this.plCurrPage = plCurrPage;
	}
	
	public int getStartRownum()
	{
		//long lngRet = plRowRange * (plCurrPage -1) + 1;	// Cubrid
		long lngRet = plRowRange * (plCurrPage -1);	// Mysql
		return (int)lngRet;
	}
	  
	public int getEndRownum()
	{
		long lngRet = Math.min(plRowRange * plCurrPage, plTotalCnt);
		return (int)lngRet;
	}
	  
	  
	
	
	
	
	/**
	 * 레코드를 페이징해주는 모듈 <br>
	 * 
	 * @param 
	 * @return
	 */
	  public String getPagingHTML(String strSingleMode, String strUrl)
	  {
	    StringBuffer tsRetVal = new StringBuffer();
	    if (plTotalCnt == 0L)
	    {
	      return "";
	    }
	    
	    if (strUrl == null) strUrl = "/";
	    if (strUrl.equals("")) strUrl = "/";	
	    
	    if (strSingleMode == null) strSingleMode = "";
	    
	    String strLink = "";
	    if (strSingleMode.equals("")) {
	    	strLink = strUrl + "?page=";
	    } else {
	    	strLink = strUrl + "?single=on&page=";
	    }

	    long plPageCnt = plTotalCnt % plRowRange;
	    if (plPageCnt == 0L)
	    {
	      plPageCnt = plTotalCnt / plRowRange;
	    }
	    else
	    {
	      plPageCnt = plTotalCnt / plRowRange + 1L;
	    }


	    long plRangeCnt = plCurrPage / plPageRange;
	    if (plCurrPage % plPageRange == 0L)
	    {
	      plRangeCnt = plCurrPage / plPageRange - 1L;
	    }


	    // DIV 시작
	    tsRetVal.append("<div class=\"paginate\">\n");


	    // 처음 페이지 버튼
	    long tlFirstPage = plCurrPage - plPageRange;
	    if (tlFirstPage > 0)
	    {
	      tsRetVal.append("<a href=\"").append(strLink + "1").append("\" class=\"pre_end\">");
	      tsRetVal.append("처음");
	      tsRetVal.append("</a>\n");
	    }
	    else
	    {
	      //tsRetVal.append("<a href=\"#\" class=\"pre_end_r\">");
	      //tsRetVal.append("처음");
	      //tsRetVal.append("</a>\n");
	    }


	    // 이전 블럭 버튼
	    if (plCurrPage > plPageRange)
	    {
	      String s2;
	      if (plCurrPage % plPageRange == 0L)
	      {
	        s2 = Long.toString(plCurrPage - plPageRange);
	      }
	      else
	      {
	        s2 = Long.toString(plCurrPage - plCurrPage % plPageRange);
	      }
	      tsRetVal.append("<a href=\"").append(strLink + s2).append("\" class=\"pre\">");
	      tsRetVal.append("이전");
	      tsRetVal.append("</a>\n");
	    }
	    else
	    {
	      //tsRetVal.append("<a href=\"#\" class=\"pre_r\">");
	      //tsRetVal.append("이전");
	      //tsRetVal.append("</a>\n");
	    }


	    // 페이징 번호
	    for (long index = plRangeCnt * plPageRange + 1L; index < (plRangeCnt + 1L) * plPageRange + 1L; index++)
	    {
	      if (index == plCurrPage)
	      {
		      tsRetVal.append("<strong>");
		      tsRetVal.append(Long.toString(index));
		      tsRetVal.append("</strong>\n");
	      } 
	      else 
	      {
		      tsRetVal.append("<a href=\"").append(strLink + Long.toString(index)).append("\">").append(Long.toString(index)).append("</a>");
		      tsRetVal.append("\n");  
	      }

	      if (index == plPageCnt)
	      {
	        break;
	      }
	    }


	    // 다음 블럭 버튼
	    if (plPageCnt > (plRangeCnt + 1L) * plPageRange)
	    {
	      tsRetVal.append("<a href=\"").append(strLink + Long.toString((plRangeCnt + 1L) * plPageRange + 1L)).append("\" class=\"next\" ").append(">");
	      tsRetVal.append("다음");
	      tsRetVal.append("</a>\n");
	    }
	    else
	    {
	      //tsRetVal.append("<a href=\"#\" class=\"next_r\">");
	      //tsRetVal.append("다음");
	      //tsRetVal.append("</a>\n");
	    }


	    // 마지막 페이지 버튼
	    long tlEndPage = plCurrPage + plPageRange;
	    if (tlEndPage < plPageCnt)
	    {
	      tsRetVal.append("<a href=\"").append(strLink + Long.toString(plPageCnt)).append("\" class=\"next_end\" ").append(">");
	      tsRetVal.append("마지막");
	      tsRetVal.append("</a>\n");
	    }
	    else
	    {
	      //tsRetVal.append("<a href=\"#\" class=\"next_end_r\">");
	      //tsRetVal.append("마지막");
	      //tsRetVal.append("</a>\n");
	    }
	    
	    
	    // DIV 종료
	    tsRetVal.append("</div>\n");
	    
	    
	    
	    return tsRetVal.toString();
	  }
	

	
	
}














